const CryptoJS = require('crypto-js');

const AesKey = CryptoJS.enc.Utf8.parse("Yv+A7casjhgCl9wzpb9AHzH/N1s7faCb"); //十六位十六进制数作为秘钥
const AesIv = CryptoJS.enc.Utf8.parse('5e8y6w45ju8w9jq8'); //十六位十六进制数作为秘钥偏移量

/**
 * 使用AES解密给定的字符串
 *
 * 该函数采用CBC模式和Pkcs7填充方式，使用指定的密钥和初始化向量(iv)来解密字符串
 * 主要用于解密经过AES加密的数据，确保数据传输或存储的安全性
 *
 * @param {string} word - 需要解密的字符串，应为AES加密后的数据
 * @returns {string} 解密后的字符串，用于进一步处理或显示
 */
export function decryptedAES(word) {
  let decrypt = CryptoJS.AES.decrypt(word, AesKey, {
    iv: AesIv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
  return decryptedStr.toString();
}

/**
 * 使用AES加密给定的字符串
 *
 * 本函数通过AES算法加密输入的字符串，使用CBC模式和Pkcs7填充方式
 * 主要用于保护敏感信息的传输和存储安全
 *
 * @param {string} word - 需要加密的字符串
 * @returns {string} - 加密后的字符串
 */
export function encryptedAES(word) {
  let srcs = CryptoJS.enc.Utf8.parse(word);
  let encrypted = CryptoJS.AES.encrypt(srcs, AesKey, {
    iv: AesIv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
  });
  return encrypted.toString();
}

const DesKey = '8008208820';
//des加密
export function encryptedDES(data, desKey = DesKey) {
  const keyHex = CryptoJS.enc.Utf8.parse(desKey);
  //模式为ECB padding为Pkcs7
  const encrypted = CryptoJS.DES.encrypt(data, keyHex, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  });
  //加密出来是一个16进制的字符串
  return encrypted.ciphertext.toString();
}

/**
 * 使用DES算法对数据进行加密
 *
 * @param {string} data - 需要加密的数据
 * @param {string} desKey - 加密所用的密钥，默认为DesKey常量
 * @returns {string} - 加密后的16进制字符串
 */
//des解密
export function decryptedDES(data, desKey = DesKey) {
  const keyHex = CryptoJS.enc.Utf8.parse(desKey);
  const decrypted = CryptoJS.DES.decrypt({
    ciphertext: CryptoJS.enc.Hex.parse(data)
  }, keyHex, {
    mode: CryptoJS.mode.ECB,
    padding: CryptoJS.pad.Pkcs7
  });
  //以utf-8的形式输出解密过后内容
  return decrypted.toString(CryptoJS.enc.Utf8);
}

/**
 * 计算给定字符串的 MD5 哈希值
 *
 * 此函数使用 CryptoJS 库对输入的字符串进行 MD5 加密，并将结果转换为字符串格式
 * MD5 是一种广泛使用的加密算法，尽管它现在被认为不够安全，但仍常用于生成数据的哈希值以确保数据完整性
 *
 * @param {string} str - 需要计算 MD5 哈希值的输入字符串
 * @returns {string} - 输入字符串的 MD5 哈希值，以十六进制字符串形式返回
 */
export function md5(str) {
  // 使用 CryptoJS 进行 MD5 加密
  return CryptoJS.MD5(str).toString();
}
